#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "task.h"

typedef void(*func_t)();

#define N 3
func_t tasks[N] = {NULL};

void LoadTask()
{
    tasks[0] = PrintLog;
    tasks[1] = Download;
    tasks[2] = MysqlDataSync;
}
void HandlerTask()
{
    for(int i = 0; i < N; i++)
    {
        tasks[i](); // 回调方式
    }
}

// fahter
void DoOtherThing()
{
    HandlerTask();
}


void ChildRun()
{
    //int *p = NULL;
    int cnt = 5;
    while(cnt)
    {
        printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
        sleep(1);
        cnt--;
        //*p = 100;
    }
}

int main()
{
    printf("I am father, pid: %d, ppid:%d\n", getpid(), getppid());

    pid_t id = fork();
    if(id == 0)
    {
        // child
        ChildRun();
        printf("child quit ...\n");
        exit(123);
    }
    LoadTask();
    // father
    while(1)
    {
        int status = 0;
        pid_t rid = waitpid(id, &status, WNOHANG); // non block
        if(rid == 0)
        {
            sleep(1);
            printf("child is running, father check next time!\n");
            DoOtherThing();
        }
        else if(rid > 0)
        {
            if(WIFEXITED(status))
            {
                printf("child quit success, child exit code : %d\n", WEXITSTATUS(status));
            }
            else
            {
                printf("child quit unnormal!\n");
            }
            break;
        }
        else
        {
            printf("waitpid failed!\n");
            break;
        }
    }


    //sleep(7);
    // fahter
    //pid_t rid = wait(NULL);
    //int status = 0;
    //pid_t rid = waitpid(id, &status, 0);
    //if(rid > 0)
    //{
    //    if(WIFEXITED(status))
    //    {
    //        printf("child quit success, child exit code : %d\n", WEXITSTATUS(status));
    //    }
    //    else
    //    {
    //        printf("child quit unnormal!\n");
    //    }
    //    printf("wait success, rid: %d\n", rid);
    //}
    //else
    //{
    //    printf("wait failed !\n");
    //}
    //sleep(3);
    //printf("father quit, status: %d, child quit code : %d, child quit signal: %d\n", status, (status>>8)&0xFF, status & 0x7F);
}






//int main()
//{
//   printf("hello 111"); 
//   sleep(2);
//
//   _exit(3);
//}

// 自定义枚举常量
///enum
///{
///    Success = 0,
///    Div_Zero,
///    Mod_Zero,
///};
///int exit_code = Success;
///const char *CodeToErrString(int code)
///{
///    switch(code)
///    {
///        case Success:
///            return "Success";
///        case Div_Zero:
///            return "div zero!";
///        case Mod_Zero:
///            return "mod zero!";
///        default:
///            return "unknow error!";
///    }
///}
///int Div(int x, int y)
///{
///    if( 0 == y )
///    {
///        exit_code = Div_Zero;
///        return -1;
///    }
///    else
///    {
///        _exit(31);
///    }
///}
///int main()
///{
///   // int *p = NULL;
///   // while(1)
///   // {
///   //     printf("I am a process, pid: %d\n", getpid());
///   //     sleep(1);
///   //     exit(123);
///   //     //*p = 100; //野指针 
///   // }
///
///    int result = Div(10, 100);
///    printf("result: %d [%s]\n", result, CodeToErrString(exit_code));
//////    result = Div(10, 0);
//////    printf("result: %d [%s]\n", result, CodeToErrString(exit_code));
//////
//////    return exit_code;
///
/////    for(int errcode = 0; errcode <= 255; errcode++)
/////    {
/////        printf("%d: %s\n", errcode, strerror(errcode));
/////    }
///
/////    printf("I am process, pid: %d, ppid: %d\n", getpid(), getppid());
///    sleep(2);
///    return 0;
///}
